﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.Linq;

namespace SSS.AlphaNN.Components
{
    public abstract class DataMedium:Dummy
    {
        #region [Properties]

        /// <summary>
        /// Путь к месту хранения файла БД
        /// </summary>
        public string PathFileDb
        {
            get;
            set;
        }

        /// <summary>
        /// Логин подключения к БД, если нужно
        /// </summary>
        public string Login
        {
            get;
            set;
        }

        /// <summary>
        /// Пароль для подключения к БД, если нужно
        /// </summary>
        public string Password
        {
            get;
            set;
        }
        
        /// <summary>
        /// Запрос к БД
        /// </summary>
        public string Query
        {
            get;
            set;
        }

        /// <summary>
        /// Количество входных параметров (сигналов)
        /// </summary>
        public int countSignal
        {
            get;
            set;
        }

        #endregion

        #region Methods

        /// <summary>
        /// Этот абстрактный метод необходим для внесения количества слотов и их последующией прорисовке 
        /// </summary>
        /// <param name="slotsAmount"></param>
        public abstract void SetSlotsAmount(int slotsAmount);

        /// <summary>
        /// Загрузка данных из источника данных
        /// </summary>
        /// <returns>Выбранные данные</returns>
        public List<List<double>> UploadDataToTempFile()
        {        
            int _countSignal=this.countSignal;
            string pathFileDb = this.PathFileDb;
            string query=this.Query;
            string login=this.Login;
            string password = this.Password;


            //для подключения
            OleDbConnection oleDataBaseConnection = null;

            List<List<double>> res = new List<List<double>>();
            try
            {
                string provider = string.Empty;
                if (PathFileDb.Contains(".accdb"))
                {
                    provider = "Microsoft.ACE.OLEDB.12.0";
                }
                else
                {
                    provider = "Microsoft.ACE.OLEDB.11.0";
                }

                oleDataBaseConnection = new OleDbConnection(string.Format(@"Provider={0}; Data Source={1}; 
                        User ID= {2}; Jet OLEDB:Database Password= {3}",
                    provider, pathFileDb, login, password));

                oleDataBaseConnection.Open();
                OleDbCommand sqlCeCommand = new OleDbCommand(query, oleDataBaseConnection);

                OleDbDataReader sqlCeDataReader = sqlCeCommand.ExecuteReader();
                List<object> li = new List<object>();
                while (sqlCeDataReader.Read())
                {

                    object[] objects = new object[_countSignal];
                    sqlCeDataReader.GetValues(objects);
                    res.Add(objects.Select(x => double.Parse(x.ToString())).ToList());
                }

                return res;
            }
            catch (Exception e)
            {
                throw new DataException(e.Message);
            }
            finally
            {
                if (oleDataBaseConnection != null && oleDataBaseConnection.State == ConnectionState.Open)
                    oleDataBaseConnection.Close();
            }

        }
        
        #endregion

    }
}
